﻿Imports Biz
Imports DAL
Imports Utils


''' <summary>
''' Clase de gestión de lógica de negocio para la entidad Usuario
''' </summary>
''' <remarks></remarks>
Public Class GestorUsuario

    Private Shared _instance As GestorUsuario
    Private Shared _semaforo As New Object

    Private _DALUsuario As DALUsuario
    Private _DALPassword As DALPassword


    ''' <summary>
    ''' Realiza una llamada a la capa de acceso a datos DAL para obtener los datos de un objeto cUsuario
    ''' </summary>
    ''' <param name="oUsuario">Objeto de tipo cUsuario con la identificación del dato a buscar</param>
    ''' <returns>Objeto de tipo cUsuario</returns>
    ''' <remarks></remarks>
    Public Function Buscar(ByVal oUsuario As cUsuario) As cUsuario

        Dim AuxUsuario As cUsuario
        Dim oPassword As cPassword

        AuxUsuario = _DALUsuario.Sel(oUsuario)
        If Not AuxUsuario Is Nothing Then
            oPassword = New cPassword
            oPassword.Usu_Legajo = AuxUsuario.Usu_Legajo

            AuxUsuario.PasswordActual = GestorPassword.Instance.Buscar_Ultimo(oPassword)
        End If

        Return AuxUsuario

    End Function

    Public Function Logon(ByVal oUsuario As cUsuario, ByRef strError As String) As cUsuario
        Dim objUsuario As New cUsuario

        objUsuario.Usu_Legajo = oUsuario.Usu_Legajo

        objUsuario = Me.Buscar(objUsuario)

        If objUsuario Is Nothing Then
            Logon = Nothing
            strError = "No se encontró el usuario ingresado"
        ElseIf objUsuario.PasswordActual Is Nothing Then
            Logon = Nothing
            strError = "No se pudo obtener la contraseña del usuario"
        ElseIf objUsuario.Estado_Usuario.EstU_Codigo = Enumeradores.EstadoUsuario.EstadoBaja Then
            Logon = Nothing
            strError = "El usuario ingresado está dado de baja"
        ElseIf objUsuario.Estado_Usuario.EstU_AccedeAlSistema = False Then
            Logon = Nothing
            strError = "El usuario tiene acceso restringido al sistema"
        ElseIf objUsuario.PasswordActual.Pwd_Password <> oUsuario.PasswordActual.Pwd_Password Then
            Logon = Nothing
            strError = "La contraseña ingresada es incorrecta"
        Else
            Logon = objUsuario
        End If

        Return Logon

    End Function

    ''' <summary>
    ''' Realiza una llamada a la capa de acceso a datos DAL para consultar la lista de Usuarios
    ''' </summary>
    ''' <returns>Colección de objetos de tipo cUsuario</returns>
    ''' <remarks></remarks>
    Public Function Consultar() As Collection
        Return _DALUsuario.SelectAll
    End Function

    ''' <summary>
    ''' Realiza una llamada a la capa de acceso a datos DAL para consultar la lista de Patentes asociadas a un Usuario
    ''' </summary>
    ''' <param name="ousuario">Objeto cUsuario</param>
    ''' <returns>Colección de objetos de tipo cPatente</returns>
    ''' <remarks></remarks>
    Public Function ConsultarPatentes(ousuario As cUsuario) As Collection
        Return _DALUsuario.Select_Patentes(ousuario.Usu_Legajo)
    End Function

    ''' <summary>
    ''' Realiza una llamada a la capa de acceso a datos DAL para consultar la lista de Familias asociadas a un Usuario
    ''' </summary>
    ''' <param name="ousuario">Objeto cUsuario</param>
    ''' <returns>Colección de objetos de tipo cFamilia</returns>
    ''' <remarks></remarks>
    Public Function ConsultarFamilias(ousuario As cUsuario) As Collection
        Return _DALUsuario.Select_Familias(ousuario.Usu_Legajo)
    End Function

    ''' <summary>
    ''' Realiza una llamada a la capa de acceso a datos DAL para insertar un nuevo Usuario
    ''' </summary>
    ''' <param name="oUsuario">Objeto de tipo cUsuario con los datos para el nuevo registro</param>
    ''' <returns>Valor booleano que indica el resultado de la operación</returns>
    ''' <remarks></remarks>
    Public Function Ingresar(ByVal oUsuario As cUsuario) As Boolean
        Return _DALUsuario.Insert(oUsuario)
    End Function

    ''' <summary>
    ''' Realiza una llamada a la capa de acceso a datos DAL para actualizar un Usuario
    ''' </summary>
    ''' <param name="oUsuario">Objeto de tipo cUsuario con los datos del registro que se va a actualizar</param>
    ''' <returns>Valor booleano que indica el resultado de la operación</returns>
    ''' <remarks></remarks>
    Public Function Editar(ByVal oUsuario As cUsuario) As Boolean
        Return _DALUsuario.Update(oUsuario)
    End Function

    ''' <summary>
    ''' Realiza una llamada a la capa de aceso a datos DAL para cambiar el Idioma de un Usuario
    ''' </summary>
    ''' <param name="oUsuario">Objeto del tipo cUsuario que será actualizado</param>
    ''' <returns>Valor booleano que indica el resultado de la operación</returns>
    ''' <remarks></remarks>
    Public Function CambiarIdioma(ByVal oUsuario As cUsuario) As Boolean
        Return _DALUsuario.CambiarIdioma(oUsuario)
    End Function

    ''' <summary>
    ''' Realiza una llamada a la capa de aceso a datos DAL para dar de Baja un Usuario
    ''' </summary>
    ''' <param name="oUsuario">Objeto del tipo cUsuario que será actualizado</param>
    ''' <returns>Valor booleano que indica el resultado de la operación</returns>
    ''' <remarks></remarks>
    Public Function Baja(ByVal oUsuario As cUsuario) As Boolean
        Return _DALUsuario.Baja(oUsuario)
    End Function

    ''' <summary>
    ''' Realiza una llamada a la capa de aceso a datos DAL para Bloquear un Usuario
    ''' </summary>
    ''' <param name="oUsuario">Objeto del tipo cUsuario que será actualizado</param>
    ''' <returns>Valor booleano que indica el resultado de la operación</returns>
    ''' <remarks></remarks>
    Public Function EstadoBloquear(ByVal oUsuario As cUsuario) As Boolean
        Return _DALUsuario.Estado_Bloquear(oUsuario)
    End Function

    ''' <summary>
    ''' Realiza una llamada a la capa de aceso a datos DAL para Activar un Usuario
    ''' </summary>
    ''' <param name="oUsuario">Objeto del tipo cUsuario que será actualizado</param>
    ''' <returns>Valor booleano que indica el resultado de la operación</returns>
    ''' <remarks></remarks>
    Public Function EstadoActivar(ByVal oUsuario As cUsuario) As Boolean
        Return _DALUsuario.Estado_Activar(oUsuario)
    End Function

    ''' <summary>
    ''' Realiza una llamada a la capa de aceso a datos DAL para asignar una Patente a un Usuario
    ''' </summary>
    ''' <param name="oUsuario">Objeto de tipo cUsuario</param>
    ''' <param name="oPatente">Objeto de tipo cPatente</param>
    ''' <returns>Valor booleano que indica el resultado de la operación</returns>
    ''' <remarks></remarks>
    Public Function Ingresar_Patente(oUsuario As cUsuario, oPatente As cPatente) As Boolean
        Return _DALUsuario.Insert_Patente(oUsuario, oPatente)
    End Function

    ''' <summary>
    ''' Realiza una llamada a la capa de aceso a datos DAL para asignar una Familia a un Usuario
    ''' </summary>
    ''' <param name="oUsuario">Objeto de tipo cUsuario</param>
    ''' <param name="oFamilia">Objeto de tipo cFamilia</param>
    ''' <returns>Valor booleano que indica el resultado de la operación</returns>
    ''' <remarks></remarks>
    Public Function Ingresar_Familia(oUsuario As cUsuario, oFamilia As cFamilia) As Boolean
        Return _DALUsuario.Insert_Familia(oUsuario, oFamilia)
    End Function

    ''' <summary>
    ''' Realiza una llamada a la capa de aceso a datos DAL para desasignar una Familia a un Usuario
    ''' </summary>
    ''' <param name="oUsuario">Objeto de tipo cUsuario</param>
    ''' <param name="oFamilia">Objeto de tipo cFamilia</param>
    ''' <returns>Valor booleano que indica el resultado de la operación</returns>
    ''' <remarks></remarks>
    Public Function Remover_Familia(oUsuario As cUsuario, oFamilia As cFamilia) As Boolean
        Return _DALUsuario.Delete_Familia(oUsuario, oFamilia)
    End Function

    ''' <summary>
    ''' Realiza una llamada a la capa de aceso a datos DAL para desasignar una Patente a un Usuario
    ''' </summary>
    ''' <param name="oUsuario">Objeto de tipo cUsuario</param>
    ''' <param name="oPatente">Objeto de tipo cFamilia</param>
    ''' <returns>Valor booleano que indica el resultado de la operación</returns>
    ''' <remarks></remarks>
    Public Function Remover_Patente(oUsuario As cUsuario, oPatente As cPatente) As Boolean
        Return _DALUsuario.Delete_Patente(oUsuario, oPatente)
    End Function

    ''' <summary>
    ''' Realiza una llamada a la capa de aceso a datos DAL para verificar si tiene asignado el permiso especificado 
    ''' </summary>
    ''' <param name="oUsuario">Objeto de tipo cUsuario</param>
    ''' <param name="oPatente">Objeto de tipo cPatente</param>
    ''' <returns>Valor booleano que indica el resultado de la operación</returns>
    ''' <remarks></remarks>
    Public Function TienePermiso(oUsuario As cUsuario, oPatente As cPatente) As Boolean
        Return _DALUsuario.TienePermiso(oUsuario, oPatente)
    End Function

    ''' <summary>
    ''' Método estático Instance para exponer una única instancia de la clase GestorUsuario
    ''' </summary>
    ''' <returns>Unica instancia de la clase GestorUsuario</returns>
    ''' <remarks></remarks>
    Public Shared Function Instance() As GestorUsuario
        If _instance Is Nothing Then
            SyncLock (_semaforo)
                If _instance Is Nothing Then
                    _instance = New GestorUsuario
                End If
            End SyncLock
        End If

        Return _instance
    End Function

    Private Sub New()
        _DALUsuario = DALUsuario.Instance
        _DALPassword = DALPassword.Instance
    End Sub

End Class
